package com.yxx.utils;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import java.util.Objects;

/**
 * 分页工具类
 * 使用 ThreadLoca 来确保每个线程都有自己独立的分页对象实例
 * PageUtils 类提供了一组静态方法来设置、获取和移除当前线程的分页信息。它使用 ThreadLocal<Page<?>> PAGE_HOLDER 来存储每个线程的分页对象，确保线程安全。
 * @author yuxiangxun
 * @date 2025/1/18
 * @apiNote
 */
public class PageUtils {

    /**
     * 定义一个ThreadLocal变量，用户存储每个线程的分页对象
     */
    private static final ThreadLocal<Page<?>> PAGE_HOLDER = new ThreadLocal<>();

    /**
     * 设置当前线程的分页对象
     * @param page
     */
    public static void setCurrentPage(Page<?> page){
        PAGE_HOLDER.set(page);
    }

    /**
     * 获取当前线程的分页对象，如果不存在则创建一个新的分页对象并设置为当前线程的分页对象
     * @return
     */
    public static Page<?> getPage(){
        Page<?> page = PAGE_HOLDER.get();
        if(Objects.isNull(page)){
            setCurrentPage(new Page<>());
        }
        return PAGE_HOLDER.get();
    }

    /**
     * 获取当前页码
     * @return
     */
    public static Long getCurrent(){
        return getPage().getCurrent();
    }

    /**
     * 获取每页大小
     * @return
     */
    public static Long getSize(){
        return getPage().getSize();
    }

    /**
     * 计算分页查询的起始位置（即 limit 值）
     * @return
     */
    public static Long getLimit(){
        return (getCurrent() - 1) * getSize();
    }

    // 移除当前线程的分页对象
    public static void remove(){
        PAGE_HOLDER.remove();
    }
}
